AWS Config アグリゲータにて高度なクエリ無しで複数AWSアカウントのリソース情報取得を試してみた

AWS Config アグリゲータにて高度なクエリ無しで複数AWSアカウントのリソース情報取得を試してみた

AWS Config アグリゲータの高度なクエリに対応していないリソースタイプの情報取得について、サンプルコマンドのポイントをまとめました。
Clock Icon2023.08.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!コンサル部のinomaso(@inomasosan)です。

AWS Config アグリゲータで、Advanced Queryに対応していないリソース情報取得を取得するためのサンプルコードを作成してみました。
試行錯誤していくなかで色々と気づきがあったので、ブログにまとめていきます。

まずはサンプルコード

取り急ぎ試されたい方は、こちらのサンプルコードをご利用ください。
以下のパラメータは適宜変更してから、CloudShell等のAWS CLIを実行できる環境でお試しください。

  • アグリゲータ名
    • --configuration-aggregator-name hoge
  • リソースタイプ
    • --resource-type AWS::EC2::LaunchTemplate
aws configservice list-aggregate-discovered-resources \
  --configuration-aggregator-name hoge \
  --resource-type AWS::EC2::LaunchTemplate \
  --query "ResourceIdentifiers[*].[SourceAccountId, SourceRegion, ResourceId, ResourceType]" \
  --output text | while read line
  do
    SourceAccountId=$(echo $line | awk '{print $1}')
    SourceRegion=$(echo $line | awk '{print $2}')
    ResourceId=$(echo $line | awk '{print $3}')
    ResourceType=$(echo $line | awk '{print $4}')
#EOSの行はスペースを省略しないとエラーになる。ただし一つ目のEOSの行はスペースがあっても良い
json=$(tr -d ' |\n' << EOS
      {
        "SourceAccountId" : "$SourceAccountId",
        "SourceRegion" : "$SourceRegion",
        "ResourceId" : "$ResourceId",
        "ResourceType" : "$ResourceType"
      }
EOS
    )
    aws configservice get-aggregate-resource-config \
      --configuration-aggregator-name hoge \
      --resource-identifier $json
  done

そもそもAWS Config アグリゲータとは?

AWSアカウントが数個程度であれば、マネジメントコンソールやAWS CLIでサービス毎の情報を管理する分には、そこまで運用負荷はかからないかと思います。 ただし、AWSアカウントが2桁~3桁になった場合はいかがでしょう?AWSアカウント毎に個別に確認するのは骨が折れそうですね。

そういった際に、ご活用いただけるのがAWS Config アグリゲータです。

AWS Config アグリゲーターを利用すると、複数アカウント・複数リージョンのAWS Config データを1アカウントに集約することが可能です。 今回の目的はリソース情報の取得ですが、Configルールのコンプライアンスルール状況の把握にもご利用いただけます。

Organizationsを利用していなくてもご利用いただけますので、まずは単一アカウントでアグリゲータを有効し検証して頂くのも良いかと思います。

まずは高度なクエリで検索できるか確認

AWS Configでは2019/3のアップデートで高度なクエリが使えるようになっています。

このアップデートによりSQLでリソース情報を取得可能になりました。
高度なクエリを使用するとAWSマネジメントコンソールで簡単にリソース情報を取得できます。

ただし2023/8/31時点で全てのリソースタイプが取得できるわけではないので、必要なリソースタイプが高度なクエリをサポートしているか以下のリンク先から確認しましょう。

高度なクエリをサポートしていないリソースタイプはどうすればいいか

高度なクエリに対応していないリソースタイプは、AWS Configにて設定項目(設定履歴)を取得する方法で対応可能です。

アグリゲータを使用して、list-aggregate-discovered-resourcesのリソース識別子を入力として、get-aggregate-resource-configbatch-get-aggregate-resource-configと組み合わせることで、リソースの設定項目を取得できます。

batch-get-aggregate-resource-configとの組み合わせ

batch-get-aggregate-resource-configを利用すると、シンプルなコマンドで情報を取得することができます。

ただし、取得したいリソースタイプの最大数は100のため、大規模な環境の場合は不向きなケースがあります。

Array Members: Minimum number of 1 item. Maximum number of 100 items.

get-aggregate-resource-configとの組み合わせ

get-aggregate-resource-configはリソースを1つずつしか取得できないため、list-aggregate-discovered-resourcesの結果をループ処理で実装する必要があります。
注意点として、--resource-identifiersはJSON形式で入力を作成する必要があるので、変数を埋め込むための工夫が必要です。

サンプルコマンドの解説

今回のサンプルコマンドを実装する上で、ポイントとなる部分を解説していきます。

list-aggregate-discovered-resourcesについて

最初に、変数にJSONの配列を格納し要素ごとに抽出する方法を検討しました。
しかし調査してみたところ、パイプで引き渡さないと要素を取り出せないことがわかりました。

JMESPath(--query)の仕様上、配列はインデックスが定義されていないのでインデックス指定での出力は空配列となるためです。 出力値を次の式に渡せるパイプであれば、配列として読み込みなおせるのでインデックス指定が可能なようです。

そのため、変数はテキスト形式で格納し、while文の中で各フィールド(列)を取得する方法で対応しています。

get-aggregate-resource-configについて

--resource-identifierにJSONの入力が必要なため、テキストで格納した変数からJSONを作成しています。 JSONに変数を埋め込む手段はいくつかあるのですが、今回はヒアドキュメントで対応しています。

尚、EOSやEOFの行についてはスペースを省略しないとエラーになりますので注意が必要です。

その他の参考リンク

まとめ

AWS Config アグリゲータでのリソース情報取得について、高度なクエリをサポートしていないリソースタイプの検索が課題となっている方に向けにブログを作成してみました。

将来的に全てのリソースタイプで高度なクエリがサポートするまでは、今回のサンプルコマンドのようにAWS CLIでリソース情報を取得する必要がありそうです。

この記事が、どなたかのお役に立てば幸いです。それでは!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.